#ifndef __APP_BUFFER_H__
#define __APP_BUFFER_H__

#include <pthread.h>

/**
 * @brief Buffer对象
 *
 * 环形缓冲区(circular buffer)
 *  有start和len字段标记数据的起始位置和长度
 *  有size字段表示缓冲区总容量
 *  数据存储在一个连续的内存块(ptr)中
 */
typedef struct BufferStruct
{
    void *ptr;            // 缓存区指针
    int size;             // 缓存区总长度
    int start;            // 数据起始offset（当前数据的起始位置索引）
    int len;              // 缓存区中数据的长度
    pthread_mutex_t lock; // Buffer锁
} Buffer;

/**
 * @brief 初始化Buffer
 *
 * @param buffer buffer对象指针
 * @param size buffer长度
 * @return int 0成功 -1失败
 */
int app_buffer_init(Buffer *buffer, int size);

/**
 * @brief 从Buffer中读取数据
 *
 * @param buffer buffer对象指针
 * @param buf 读出数据的缓存区指针
 * @param len 缓存区长度
 * @return int 成功返回实际读取的长度，-1失败
 */
int app_buffer_read(Buffer *buffer, void *buf, int len);

/**
 * @brief 向Buffer中写入数据
 *
 * @param buffer buffer对象指针
 * @param buf 要写入的数据指针
 * @param len 要写入的长度
 * @return int 0成功 -1失败
 */
int app_buffer_write(Buffer *buffer, void *buf, int len);

/**
 * @brief 销毁Buffer
 *
 * @param buffer buffer指针
 */
void app_buffer_close(Buffer *buffer);

#endif
